class DoublyListNode {
  constructor(value = 0, next = null, prev = null) {
      this.value = value;
      this.next = next;
      this.prev = prev;
  }
}

class DoublyLinkedList {
  constructor() {
      this.head = null; // 链表的头节点
      this.tail = null; // 链表的尾节点，对于双向链表很重要，因为它允许我们高效地添加新元素到末尾。
  }
  // 添加节点到链表末尾（双向）
  append(value) {
      const newNode = new DoublyListNode(value);
      if (!this.head) { // 如果链表为空，新节点既是头节点也是尾节点。
          this.head = this.tail = newNode;
      } else { // 否则，添加到尾部并更新尾部指针。
          this.tail.next = newNode; // 当前尾节点的下一个是新的尾节点。
          newNode.prev = this.tail; // 新节点的上一个是当前的尾节点。
          this.tail = newNode; // 更新尾节点为新节点。
      }
  }
  // 打印链表的所有值（双向）从头部到尾部。
  print() {
      let current = this.head;
      while (current) {
          console.log(current.value); // 从头部开始打印。如果要打印反向，使用current = current.prev。
          current = current.next; // 移动到下一个节点。对于反向打印，使用current = current.prev。
      }
  }
}

const doublyList = new DoublyLinkedList();
doublyList.append(1); // 添加到尾部。如果需要从头部添加，可以修改append方法或添加其他方法如prepend。 
doublyList.append(2); // 同上。  // 注意：这里我们用的是单向的打印方式，如果要打印反向，需要修改print方法。  // doublyList.print(); // 按顺序输出: 1, 2 或者反向输出: 2, 1（根据print方法的实现）  // 注意：上面的注释是关于如何实现从头部添加和反向打印的建议，具体实现取决于你的具体需求。如果要实现从头部添加或反向打印，你需要相应地修改append或print方法。例如，从